package cn.tedu.charging.order.websocket;

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.concurrent.ConcurrentHashMap;

@Slf4j
@Component
@ServerEndpoint("/ws/server/{userId}")
public class WebSocketServer {

    /**
     * 本地的map 在内存里,重启后,数据就清空了,session清空了
     * 用户和服务端的连接断开了
     * 持久化的概念,要考虑持久化的压力,有多少用户同时在线
     */
    private static ConcurrentHashMap<Integer,Session> sessions =
            new ConcurrentHashMap<>();


    /**
     * 发送消息,服务端给用户发送消息
     * @param  userId 表示给谁发
     * @param message 发什么信息
     */
    public void sendMessage(Integer userId,String message){
        Session session = sessions.get(userId);
        if (session != null) {
            try {
                session.getBasicRemote().sendText(message);
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }else {
            log.debug("用户:{},已经下线",userId);
        }
    }

    /**
     * 建立连接成功调用的方法, 类似 mqtt MqttConsumer#connectComplete
     * @param session 会话状态
     */
    @OnOpen
    public void onOpen(Session session, @PathParam("userId") Integer userId) {
        log.debug("onOpen");
        sessions.put(userId,session);
        log.debug("用户:{},连接成功:{}",userId,session);
    }

    @OnClose
    public void onClose(Session session, @PathParam("userId") Integer userId) {
        log.debug("OnClose");
        sessions.remove(userId);
        log.debug("用户:{},退出",userId,session);
    }

    /**
     * 消息到达  类似 mqtt MqttConsumer#messageArrived ,用户到服务端(订单服务)
     * @param session
     * @param message
     */
    @OnMessage
    public void onMessage(String message,Session session) {
        log.debug("OnMessage");
        log.debug("用户:{},发送消息:{}",session,message);
    }

    /**
     * 出现问题时调用此方法,具体的错误原因 throwable,谁出现的问题呢  session
     * @param session
     * @param throwable
     */
    @OnError
    public void onMessage(Session session,Throwable throwable) {
       log.error("onError",throwable);
    }





}
